package Calculadora.Stack.StackList;
/**
 * Implementacion de stack con Lista con enlace simple
 * @param <E>  clase generica
 * @author Vinicio Gomez
 * @since 12/08/2012
 * @version 1.0
 * @see List
 */
public class SinglyLinkedList<E> extends AbstractList<E>{
   /**Cantidad de objetos en la lista*/ 
   protected int count;
   /**El primer elemento de la lista*/
   protected SinglyLinkedListElement head;

   /**
    * Contructor
    * @pre: N/A
    * @post: genera una lista nueva y vacia
    * @since 12/08/2012
    */
   public SinglyLinkedList(){
      head = null;
      count = 0;
   }
   
   /**
    * Determina la cantidad de objetos de la lista
    * @return cantidad de objetos de la lista
    * @pre N/A
    * @post retorna la cantidad de objetos de la lista
    * @since 12/08/2012
    * @see List
    */
    @Override
   public int size(){
    return count;
  }
  
  /**
    * Agrega un objeto al inico de la lista
    * @param item El objeto a agregar a la lista
    * @pre N/A
    * @post El objeto es agregado al inicio de la lista
    * @since 12/08/2012
    * @see List
    */
    @Override
    public void addFirst(E item){
     head = new SinglyLinkedListElement(item, head);
     count++;
    }

    /**
     * Se obtiene la referencia del primer objeto en la lista
     * @return la referencia del primer objeto en la lista
     * @pre que la lista no este vacia
     * @post retorna la referencia del primero objeto en la lista
     * @since 12/08/2012
     * @see List
     */
    @Override
    public E getFirst() {
       return (E)head.value(); 
    }

    /**
     * Se remueve el primer objeto en la lista
     * @return El primer objeto en la lista
     * @pre que la lista no este vacia
     * @post se remueve el primer objeto en la lista
     * @since 12/08/2012
     * @see List
     */
    @Override
    public E removeFirst() {
        SinglyLinkedListElement temp = head;
	head = head.next(); // move head down list
	count--;
	return (E)temp.value();
    }
}
